var CryptoJS = CryptoJS || function (h, o) {
    var f = {}, j = f.lib = {}, k = j.Base = function () {
        function a() {
        }

        return {
            extend: function (b) {
                a.prototype = this;
                var c = new a;
                b && c.mixIn(b);
                c.$super = this;
                return c
            }, create: function () {
                var a = this.extend();
                a.init.apply(a, arguments);
                return a
            }, init: function () {
            }, mixIn: function (a) {
                for (var c in a) a.hasOwnProperty(c) && (this[c] = a[c]);
                a.hasOwnProperty("toString") && (this.toString = a.toString)
            }, clone: function () {
                return this.$super.extend(this)
            }
        }
    }(), i = j.WordArray = k.extend({
        init: function (a, b) {
            a =
                this.words = a || [];
            this.sigBytes = b != o ? b : 4 * a.length
        }, toString: function (a) {
            return (a || p).stringify(this)
        }, concat: function (a) {
            var b = this.words, c = a.words, d = this.sigBytes, a = a.sigBytes;
            this.clamp();
            if (d % 4) for (var e = 0; e < a; e++) b[d + e >>> 2] |= (c[e >>> 2] >>> 24 - 8 * (e % 4) & 255) << 24 - 8 * ((d + e) % 4); else if (65535 < c.length) for (e = 0; e < a; e += 4) b[d + e >>> 2] = c[e >>> 2]; else b.push.apply(b, c);
            this.sigBytes += a;
            return this
        }, clamp: function () {
            var a = this.words, b = this.sigBytes;
            a[b >>> 2] &= 4294967295 << 32 - 8 * (b % 4);
            a.length = h.ceil(b / 4)
        }, clone: function () {
            var a =
                k.clone.call(this);
            a.words = this.words.slice(0);
            return a
        }, random: function (a) {
            for (var b = [], c = 0; c < a; c += 4) b.push(4294967296 * h.random() | 0);
            return i.create(b, a)
        }
    }), l = f.enc = {}, p = l.Hex = {
        stringify: function (a) {
            for (var b = a.words, a = a.sigBytes, c = [], d = 0; d < a; d++) {
                var e = b[d >>> 2] >>> 24 - 8 * (d % 4) & 255;
                c.push((e >>> 4).toString(16));
                c.push((e & 15).toString(16))
            }
            return c.join("")
        }, parse: function (a) {
            for (var b = a.length, c = [], d = 0; d < b; d += 2) c[d >>> 3] |= parseInt(a.substr(d, 2), 16) << 24 - 4 * (d % 8);
            return i.create(c, b / 2)
        }
    }, n = l.Latin1 = {
        stringify: function (a) {
            for (var b =
                a.words, a = a.sigBytes, c = [], d = 0; d < a; d++) c.push(String.fromCharCode(b[d >>> 2] >>> 24 - 8 * (d % 4) & 255));
            return c.join("")
        }, parse: function (a) {
            for (var b = a.length, c = [], d = 0; d < b; d++) c[d >>> 2] |= (a.charCodeAt(d) & 255) << 24 - 8 * (d % 4);
            return i.create(c, b)
        }
    }, q = l.Utf8 = {
        stringify: function (a) {
            try {
                return decodeURIComponent(escape(n.stringify(a)))
            } catch (b) {
                throw Error("Malformed UTF-8 data");
            }
        }, parse: function (a) {
            return n.parse(unescape(encodeURIComponent(a)))
        }
    }, m = j.BufferedBlockAlgorithm = k.extend({
        reset: function () {
            this._data = i.create();
            this._nDataBytes = 0
        }, _append: function (a) {
            "string" == typeof a && (a = q.parse(a));
            this._data.concat(a);
            this._nDataBytes += a.sigBytes
        }, _process: function (a) {
            var b = this._data, c = b.words, d = b.sigBytes, e = this.blockSize, f = d / (4 * e),
                f = a ? h.ceil(f) : h.max((f | 0) - this._minBufferSize, 0), a = f * e, d = h.min(4 * a, d);
            if (a) {
                for (var g = 0; g < a; g += e) this._doProcessBlock(c, g);
                g = c.splice(0, a);
                b.sigBytes -= d
            }
            return i.create(g, d)
        }, clone: function () {
            var a = k.clone.call(this);
            a._data = this._data.clone();
            return a
        }, _minBufferSize: 0
    });
    j.Hasher = m.extend({
        init: function () {
            this.reset()
        },
        reset: function () {
            m.reset.call(this);
            this._doReset()
        }, update: function (a) {
            this._append(a);
            this._process();
            return this
        }, finalize: function (a) {
            a && this._append(a);
            this._doFinalize();
            return this._hash
        }, clone: function () {
            var a = m.clone.call(this);
            a._hash = this._hash.clone();
            return a
        }, blockSize: 16, _createHelper: function (a) {
            return function (b, c) {
                return a.create(c).finalize(b)
            }
        }, _createHmacHelper: function (a) {
            return function (b, c) {
                return r.HMAC.create(a, c).finalize(b)
            }
        }
    });
    var r = f.algo = {};
    return f
}(Math);

(function () {
    var h = CryptoJS, i = h.lib.WordArray;
    h.enc.Base64 = {
        stringify: function (b) {
            var e = b.words, f = b.sigBytes, c = this._map;
            b.clamp();
            for (var b = [], a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63));
            if (e = c.charAt(64)) for (; b.length % 4;) b.push(e);
            return b.join("")
        }, parse: function (b) {
            var b = b.replace(/\s/g, ""), e = b.length, f = this._map, c = f.charAt(64);
            c && (c = b.indexOf(c), -1 != c && (e = c));
            for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) {
                var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4), h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
                c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
                a++
            }
            return i.create(c, a)
        }, _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
    }
})();

var kk = (function (w, cry) {
    function Tool() {

    }

    /**
     * @param production 生产环境
     * @param dev        开发环境
     */
    Tool.prototype.env = 'production'

    //@desc是否是苹果移动端
    //@return Boolean
    Tool.prototype.isIos = (function () {
        return !!navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);
    })()

    //@desc 是否是安卓移动端
    //@return Boolean
    Tool.prototype.isAndroid = (function () {
        return navigator.userAgent.indexOf('Android') > -1 || navigator.userAgent.indexOf('Linux') > -1;
    })()

    Tool.prototype.ajaxGet = function (url, query, succCb, failCb, isJson) {
        // 拼接url加query
        if (query) {
            url += "?";
            for (var key in query) {
                url += key + "=" + query[key] + "&";
            }
            // 把最后一个&删掉
            url = url.slice(0, -1);
        }

        // 1、创建对象
        var ajax = new XMLHttpRequest();
        // 2、建立连接
        ajax.open("GET", url, true);

        // 3、发送请求
        ajax.send(null);

        // 4、监听状态的改变
        ajax.onreadystatechange = function () {
            if (ajax.readyState === 4) {
                if (ajax.status === 200) {
                    // 用户传了回调才执行
                    // isJson默认值为true，要解析json
                    if (isJson === undefined) {
                        isJson = true;
                    }
                    var res = isJson ? JSON.parse(ajax.responseText) : ajax.responseText;
                    succCb && succCb(res);
                } else {
                    // 请求失败
                    failCb && failCb();
                }

            }
        }
    }

    Tool.prototype.ajaxPost = function (url, query, succCb, failCb, isJson) {
        var ajax = new XMLHttpRequest();

        ajax.open("POST", url, true);
        // 设置请求头数据传输格式
        ajax.setRequestHeader("Content-type", "application/x-www-form-urlencoded");

        // 把query拼接成urlencoded

        var str = "";
        for (var key in query) {
            str += key + "=" + query[key] + "&";
        }
        str = str.slice(0, -1);

        ajax.send(str);

        ajax.onreadystatechange = function () {
            if (ajax.readyState === 4) {
                if (ajax.status === 200) {
                    // 判断isJson是否传进来了
                    isJson = isJson === undefined ? true : isJson;
                    succCb && succCb(isJson ? JSON.parse(ajax.responseText) : ajax.responseText);
                }
            }
        }
    }

    //@desc 客户端 GET 请求
    //@method GET
    //@param String url 请求的 URL
    //@param Object data 请求的 query 参数, 没有可传空
    //@param callback String 回调函数的名字,此回调函数会在请求成功之后由客户端调起
    Tool.prototype.get = function (url, data, callback) {
        this.callback = callback
        var data = {
            requestType: 'GET',
            url: url,
            para: data,
            response: 'kk.callback'
        };
        if (this.isAndroid && this.env === 'production') {
            keke.commonRequestAction(JSON.stringify(data));
        } else if (this.isIos && this.env === 'production') {
            window.webkit.messageHandlers.commonRequestAction.postMessage(data);
        } else {
            this.ajaxGet(url, data.para, callback)
        }
    }

    //@desc 客户端 POST 请求
    //@method POST
    //@param String url 请求的 URL
    //@param Object data 请求的 query 参数, 没有可传空
    //@param callback String 回调函数的名字,此回调函数会在请求成功之后由客户端调起
    Tool.prototype.post = function (url, data, callback) {
        this.callback = callback
        var data = {
            requestType: 'POST',
            url: url,
            para: data,
            response: 'kk.callback'
        };
        if (this.isAndroid && this.env === 'production') {
            keke.commonRequestAction(JSON.stringify(data));
        } else if (this.isIos && this.env === 'production') {
            window.webkit.messageHandlers.commonRequestAction.postMessage(data);
        } else {
            this.ajaxPost(url, data.para, callback)
        }
    }

    /*
     * 跳转客户端房间
     * */
    Tool.prototype.goRoom = function (params) {
        if (this.isIos) {
            window.webkit.messageHandlers.roomClicked.postMessage(params);
        } else if (this.isAndroid) {
            keke.roomClicked(params)
        }
    }


    //@desc 唤醒客户端分享
    //@param String img 分享的图片
    //@param String title 分享的标题
    //@param String desc 分享的描述
    //@param String url 分享的链接
    Tool.prototype.share = function (img, title, desc, url) {
        var data = {
            img: img,
            title: title,
            desc: desc,
            url: url
        };
        if (this.isIos) {
            window.webkit.messageHandlers.shareClicked.postMessage(data);
        } else if (this.isAndroid) {
            keke.shareClicked(data.url, data.img, data.desc, data.title);
        }
    }

    //@desc 唤醒客户端支付
    Tool.prototype.pay = function () {
        if (this.isIos) {
            window.webkit.messageHandlers.rechargeClicked.postMessage('');
        } else if (this.isAndroid) {
            keke.rechargeClicked();
        }
    }


    Tool.prototype.getCookie = function (fun) {
        if (this.isIos) {
            window.webkit.messageHandlers.getCookieToken.postMessage('');
        } else if (this.isAndroid) {
            keke.getCookieToken();
        }

        w.userCookieToken = function (str) {
            fun(str)
        }
    }

    //@desc 解析 URL 参数部分
    //@return array
    Tool.prototype.$_GET = (function () {
        var url = window.document.location.href.toString();
        var u = url.split("?");
        if (typeof (u[1]) == "string") {
            u = u[1].split("&");
            var get = {};
            for (var i in u) {
                var j = u[i].split("=");
                get[j[0]] = j[1];
            }
            return get;
        } else {
            return {};
        }
    })()

    Tool.prototype.parseBase64 = function (res) {
        res = cry.enc.Base64.parse(res)
        result = res.toString(cry.enc.Utf8)
        result = eval('(' + result + ')')
        return result
    }

    /**
     * 打开客户端页面
     * */
    Tool.prototype.openClientView = function (params) {
        if (this.isIos) {
            window.webkit.messageHandlers.onClickOpen.postMessage(params);
        } else if (this.isAndroid) {
            keke.onClickOpen(JSON.stringify(params));
        }
    }
    //通过客户端打开h5页面
    Tool.prototype.openClientHtml = function (params) {
        if (this.isIos) {
            window.webkit.messageHandlers.klsPushNewWebClicked.postMessage(params);
        } else if (this.isAndroid) {
            keke.klsPushNewWebClicked(JSON.stringify(params));
        }
    }

    return new Tool();
})(window, CryptoJS)

